package cn.tedu.springboot01;

import cn.tedu.springboot01.entity.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;

// webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT 生成随机测试端口号
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class JunitTest04 {

    /**
     * @SpringBootTest在启动的时候，会自动的创建对象TestRestTemplate对象 TestRestTemplate提供了调用访问控制层的方法，完成Http请求测试
     */
    @Autowired
    TestRestTemplate testRestTemplate;

    @Test
    void testRest() {
        // 指定测试的请求路径
        // "demo/hello" 相对路径
        // "http://127.0.0.1:8.81/demo/hello" 类似这种的为绝对路径
        String path = "/demo/hello";
        // TestRestTemplate会自动找到随机端口号，然后发起相对路径请求
        // getForObject(参数1,参数2);---参数1:指定的请求路径 参数2:指定的返回值的数据类型
        String message = testRestTemplate.getForObject(path, String.class);
        System.out.println(message);
        // 利用断言进行测试返回结果
        Assertions.assertEquals("Hello World!", message);
    }

    // 测试用户登录请求
    @Test
    void login() {
        // 指定请求相对路径
        // ?username={username}&pwd={pwd}是发起get请求的参数
        // {username}和{pwd}是参数占位符
        String url = "/users/login?username={username}&pwd={pwd}";
        // 发起get请求
        String message = testRestTemplate.getForObject(url, String.class, "tom", "1234");
        System.out.println(message);
        Assertions.assertEquals("登录成功！", message);
    }

    // 测试用户注册请求
    @Test
    void register() {
        /**
         * 用TestRestTemplate实现Post请求测试
         */
        String url = "/users/register";
        User user = new User();
        user.setUsername("who");
        user.setPassword("12345678");
        user.setRoles("ADMIN");
        String msg = testRestTemplate.postForObject(url, user, String.class);
        System.out.println(msg);
        Assertions.assertEquals("注册成功！", msg);
    }

    // 测试基于用户id获取用户信息
    @Test
    void getUser() {
        String url = "/users/{id}";
        User user = testRestTemplate.getForObject(url, User.class, 2);
        System.out.println(user);
    }

    // 基于用户id删除用户数据
    @Test
    void delete() {
        String url = "/users/{id}";
        testRestTemplate.delete(url, 4);
        System.out.println("删除成功");
    }

    @Test
    void test01() {
        System.out.println("JunitTest04.test01");
    }

}
